home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Almathera Ten Pack 3: CDPD 3
/
Almathera Ten on Ten - Disc 3: CDPD3.iso
/
fish
/
651-675
/
658
/
bump
/
bump.c
< prev
next >
Wrap
C/C++ Source or Header
|
1995-03-18
|
8KB
|
309 lines
/*-- AutoRev header do NOT edit!
*
* Program : Bump.c
* Copyright : © Copyright 1992 Jaba Development
* Author : Jan van den Baard
* Creation Date : 6-Feb-92
* Current version : 1.0
* Translator : DICE v2.06
*
* REVISION HISTORY
*
* Date Version Comment
* --------- ------- ------------------------------------------
* 21-Mar-92 1.0 Added "ONLYDATE" option.
* 08-Feb-92 1.0 Added "QUIET" option.
* 06-Feb-92 1.0 Version string updater.
*
*-- REV_END --*/
/*
* --- Compiling : dcc -r -mRR -proto Bump.c -o Bump
*/
#include <exec/types.h>
#include <exec/memory.h>
#include <dos/dos.h>
#include <dos/rdargs.h>
#include <clib/exec_protos.h>
#include <clib/dos_protos.h>
#include <clib/utility_protos.h>
#include <ctype.h>
#include <stdarg.h>
/*
* --- Some macros
*/
#define SKIP_BLANKS(p) while(isspace(*p)) p++;
#define SEEK_DIGIT(p) while(!isdigit(*p)) p++;
#define FIND_DOT(p) while(*p++ != '.');
/*
* --- The version string
*/
static UBYTE *version_string = "$VER: BUMP 37.15 (21.3.92)";
/*
* --- For the shell args
*/
UBYTE *template = "Name/A,INCVER/S,INCREV/S,SETVER/K/N,SETREV/K/N,QUIET/S,ONLYDATE/S";
ULONG array[7] = { 0L, 0L, 0L, 0L, 0L, 0L, 0L };
/*
* --- Some global data
*/
UBYTE *header = "Error -";
BPTR stdout = NULL;
UBYTE *pointer = NULL;
ULONG filesize;
/*
* --- Function proto's
*/
extern ULONG atoi( UBYTE * );
extern void exit( long );
ULONG MyFPrintf( BPTR, UBYTE *, ... );
UBYTE *SeekVersion( void );
LONG CheckFormat( UBYTE * );
LONG ReadSourceFile( void );
ULONG GetNum( UBYTE * );
void DoDate( BPTR );
/*
* --- Perform formatted output
*/
ULONG MyFPrintf( BPTR fh, UBYTE *format, ... )
{
va_list args;
long ret;
va_start( args, format );
ret = VFPrintf( fh, format, args );
va_end( args );
return( ret );
}
/*
* --- Check the version string format.
*/
LONG CheckFormat( UBYTE *ptr )
{
UBYTE d = 0, l = 0, r = 0;
while( *ptr != 0x22 && *ptr != 0x27 ) {
switch( *ptr ) {
case '.':
d++;
break;
case '(':
l++;
break;
case ')':
r++;
break;
}
ptr++;
}
if ( d != 3 || l != 1 || r != 1 )
return( FALSE );
return( TRUE );
}
/*
* --- Search through the buffer for the version string
*/
UBYTE *SeekVersion( void )
{
UBYTE *ptr = pointer;
ULONG num = 0L;
while( 1 ) {
if( *ptr == '$' && ! Strnicmp( ptr + 1, "VER: ", 5 ))
return( ptr );
ptr++;
if ( num++ > ( filesize - 18 ))
return( 0L );
}
return( ptr );
}
/*
* --- Read in the source file
*/
LONG ReadSourceFile( void )
{
BPTR file;
stdout = Output();
if ( file = Open(( UBYTE * )array[ 0 ], MODE_OLDFILE )) {
Seek( file, 0L, OFFSET_END );
filesize = Seek( file, 0L, OFFSET_BEGINNING );
if ( pointer = ( UBYTE * )AllocMem( filesize, MEMF_PUBLIC )) {
if ( Read( file, pointer, filesize ) == filesize ) {
Close( file );
return( TRUE );
} else
PrintFault( IoErr(), header );
FreeMem( pointer, filesize );
} else {
SetIoErr( ERROR_NO_FREE_STORE );
PrintFault( ERROR_NO_FREE_STORE, header );
}
Close( file );
} else {
MyFPrintf( stdout, "Can't open \"%s\" for input - ", array[ 0 ] );
PrintFault( IoErr(), NULL );
}
return( FALSE );
}
/*
* --- Convert the numbers from the source
* --- into real numbers.
*/
ULONG GetNum( UBYTE *ptr )
{
UBYTE number[ 20 ], i = 0;
while( isdigit( *ptr )) {
number[ i++ ] = *ptr++;
}
number[ i ] = 0;
return( atoi( number ));
}
/*
* --- Ouput the current system date to the file.
*/
void DoDate( BPTR file )
{
struct DateTime dt;
char date[10];
ULONG day, month, year;
DateStamp((struct DateStamp *)&dt);
dt.dat_Format = FORMAT_CDN;
dt.dat_StrDate = &date[0];
dt.dat_Flags = 0;
dt.dat_StrDay = 0;
dt.dat_StrTime = 0;
DateToStr(&dt);
day = GetNum( &date[ 0 ] );
month = GetNum( &date[ 3 ] );
year = GetNum( &date[ 6 ] );
MyFPrintf( file, "(%ld.%ld.%ld)", day, month, year );
}
void _main( void )
{
struct RDArgs *cli_args;
BPTR file;
UBYTE *ptr, *ptr1;
ULONG revision, version, i;
stdout = Output();
if ( cli_args = ReadArgs( template, &array[ 0 ], 0L )) {
if ( ! array[ 1 ] && ! array[ 2 ] && ! array [ 3 ] && ! array[ 4 ] && ! array[ 6 ] ) {
array[ 2 ] = TRUE;
if ( ! array[ 5 ] )
FPuts( stdout, "Defaulting to INCREV\n" );
}
SetIoErr( NULL );
if ( ReadSourceFile()) {
SetIoErr( 0L );
if ( ! array[ 5 ] )
MyFPrintf( stdout, "Processing \"%s\"\n", array[ 0 ] );
if ( ptr = SeekVersion()) {
if ( CheckFormat( ptr )) {
ptr1 = pointer;
if ( ! array[ 5 ] )
MyFPrintf( stdout, "Found version string at offset %ld in \"%s\"\n", ptr - ptr1, array[ 0 ] );
ptr += 6;
if ( file = Open(( UBYTE * )array[ 0 ], MODE_NEWFILE )) {
FWrite( file, ptr1, (ULONG)( ptr - ptr1 ), 1);
SKIP_BLANKS( ptr );
if ( ! array[ 5 ] )
FPuts( stdout, "Program name \"" );
while( ! isspace( *ptr )) {
FPutC( file, *ptr );
if ( ! array[ 5 ] )
FPutC( stdout, *ptr );
ptr++;
}
if ( ! array[ 5 ] )
FPuts( stdout, "\"\n" );
SEEK_DIGIT( ptr );
version = GetNum( ptr );
FIND_DOT( ptr );
revision = GetNum( ptr );
if ( ! array[ 5 ] ) {
if ( ! array[ 6 ] )
MyFPrintf( stdout, "Old version : %ld.%ld\n", version, revision );
else
FPuts( stdout, "Updating version date\n" );
}
if ( ! array[ 6 ] ) {
if ( array[ 2 ] ) revision++;
else if ( array[ 4 ] ) revision = *((ULONG *)array[ 4 ] );
if ( array[ 1 ] ) version++;
else if ( array[ 3 ] ) version = *((ULONG *)array[ 3 ] );
}
if ( ! array[ 5 ] ) {
if ( ! array[ 6 ] )
MyFPrintf( stdout, "New version : %ld.%ld\n", version, revision );
}
MyFPrintf( file, " %ld.%ld ", version, revision );
DoDate( file );
while( *ptr != 0x22 && *ptr != 0x27 ) ptr++;
FWrite( file, ptr, (ULONG)( filesize - (ULONG)( ptr - ptr1 )), 1 );
Close( file );
if ( IoErr())
PrintFault( IoErr(), header );
else if ( ! array[ 5 ] )
FPuts( stdout, "Done.\n" );
}
} else
FPuts( stdout, "Error -: Malformed version string\n" );
} else
FPuts( stdout, "Error -: no version string found\n" );
FreeMem( pointer, filesize );
}
FreeArgs( cli_args );
} else
PrintFault( IoErr(), header );
exit( IoErr());
}